const express = require('express')
const { expressjwt } = require('express-jwt')
const Joi = require('joi')
// var { expressjwt: jwt } = require("express-jwt");
const config = require('./config/index')
const userRouter = require('./router/user')
const userinfoRouter = require('./router/userinfo')
const createArticle = require('./router/article')
// 导入并配置 cors 解决跨域的中间件
const cors = require('cors')
const app = express()

console.log('expressjwt', expressjwt)




app.use(express.static('static'))
app.use(cors())

// 封装一个全局错误处理中间件：  一定要在路由处理函数之前
app.use((req, res, next) => {
    /**
     * 
     * @param {*} err 错误对象或错误信息
     * @param {*} code 错误状态码
     */
    res.err = (err = '', code = 1) => {
        res.json({
            code,
            msg: err instanceof Error ? err.message : err,
            data: false
        })
    }
    next()
})
app.use((req, res, next) => {
    /**
     * 
     * @param {*} msg msg 消息
     * @param {*} data data 数据
     * @param {*} code  code 状态码
     */
    res.suc = (msg = '请求', data = true, code = 200,) => {
        res.json({
            code,
            msg: msg + '成功',
            data: data
        })
    }
    next()
})

// 使用解析 token 中间件
app.use(expressjwt({ secret: require('./config/index').encryptionKey.tokenKey, algorithms: ['HS256'] }).unless({ path: [/^\/api\//] }))

// 配置解析表单数据的中间件  解析 x-www-form-urlencoded 格式的表单数据
app.use(express.urlencoded({ extended: false }))
// 配置解析 body 参数中间件
app.use(express.json())

app.use('/api', userRouter)
app.use('/my', userinfoRouter)
app.use('/article', createArticle)


// 定义局部错误中间件 
app.use(function (err, req, res, next) {
    // touke 错误
    if (err.name === 'UnauthorizedError') return res.err(err)
    // 4.1 Joi 参数校验失败 判断err 是不是 Joi 的错误实例  
    if (err instanceof Joi.ValidationError) {
        return res.err(err.message)
    }
    // 4.2 未知错误
    res.err(err)
})
app.listen(config.serverPort, () => {
    console.log(config.serverPort + '服务启动中。。。')
})